﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace WinSPen.Objects
{
    public enum Layer
    {
        Local,
        Network,
    }

    /// <summary>
    /// Local layer와 Network layer의 공통 추상 클래스
    /// </summary>
    public abstract class WSPLayer
    {
        public WSPLayer(Layer layer)
        {
            this._layerType = layer;
        }

        private List<WSPObject> _objectList;

        /// <summary>
        /// 이 Layer에 포함된 object(Stroke, Text)
        /// </summary>
        public List<WSPObject> ObjectList
        {
            get
            {
                if (this._objectList == null)
                {
                    this._objectList = new List<WSPObject>();
                }
                return this._objectList;
            }
        }

        private Layer _layerType;

        /// <summary>
        /// 이 Layer의 Type(Local, Network)
        /// </summary>
        public Layer LayerType
        {
            get { return this._layerType; }
        }

        /// <summary>
        /// 입력된 objectID와 동일한 object를 이 Layer 내에서 탐색합니다.
        /// </summary>
        /// <param name="objectID">찾고자 하는 object의 ID</param>
        /// <returns>찾는 ID의 object가 있으면 해당 object, 없으면 null</returns>
        public WSPObject GetObjectByID(int objectID)
        {
            foreach (WSPObject item in this._objectList)
            {
                // Local
                if (this._layerType == Layer.Local)
                {
                    if (item.GetLocalObjectID() == objectID)
                    {
                        return item;
                    }
                }
                // Network
                else
                {
                    if (item.GetNetworkObjectID() == objectID)
                    {
                        return item;
                    }
                }
            }

            return null;
        }

        /// <summary>
        /// WSPObject(WSPStroke, WSPText) 를 추가한다.
        /// </summary>
        /// <param name="wspObject">추가할 WSPObject</param>
        public void AddObject(WSPObject wspObject)
        {
            this._objectList.Add(wspObject);
        }

        /// <summary>
        /// 이 Layer의 마지막 WSPObject의 ID를 가져온다.
        /// </summary>
        /// <returns>마지막 WSPObject의 ID</returns>
        public int GetLastObjectID()
        {
            int lastID = -1;

            // 모든 item 중 가장 큰 ID를 찾는다.
            foreach (WSPObject item in this._objectList)
            {
                if (this._layerType == Layer.Local)
                {
                    lastID = (item.GetLocalObjectID() > lastID) ? item.GetLocalObjectID() : lastID;
                }
                else
                {
                    lastID = (item.GetNetworkObjectID() > lastID) ? item.GetNetworkObjectID() : lastID;
                }
            }

            return lastID;
        }
    }
}
